#include "mprpcconfig.h"
#include <iostream>

// 负责解析加载配置文件
void MprpcConfig::LoadConfigFile(const char* config_file)
{
    FILE* pf = fopen(config_file, "r");
    if (nullptr == pf) {
        std::cout << config_file << " is not exist!" << std::endl;
        exit(EXIT_FAILURE);
    }

    // 1.注释  2.正确的配置项:K=V  3.去掉开头的多余空格 
    while (!feof(pf))
    {
        char buf[512] = {0};
        fgets(buf, 512, pf);

        // 去掉字符串前后多余的空格
        std::string read_buf(buf);
        Trim(read_buf);

        // 判断是否为注释或者是否为空
        if (read_buf[0] == '#' || read_buf.empty()) {
            continue;
        }

        // 解析配置项
        int index = read_buf.find('=');
        if (index == -1) {
            // 配置项不合法
            continue;
        }

        std::string key;
        std::string value;
        key = read_buf.substr(0, index);
        Trim(key);
        // rpcserverip=127.0.0.1\n
        int endindex = read_buf.find('\n', index);
        value = read_buf.substr(index+1, endindex-index-1);
        Trim(value);
        
        // 将解析完后的key value插入到hash中
        m_configMap.insert(std::make_pair(std::move(key), std::move(value)));
    }
    fclose(pf);
}

// 去掉字符串前后的空格
void MprpcConfig::Trim(std::string& src_buf)
{
    // 查找第一个非空格字符的index
    int index = src_buf.find_first_not_of(' ');
    if (index != -1) {
        // 说明字符串前面有空格
        src_buf = src_buf.substr(index, src_buf.size()-index);
    }
    // 查找最后一个非空格字符的index
    index = src_buf.find_last_not_of(' ');
    if (index != -1) {
        // 说明字符串后面有空格
        src_buf = src_buf.substr(0, index+1);
    }
}

// 查询配置项信息
std::string MprpcConfig::Load(const std::string& key)
{
    auto it = m_configMap.find(key);
    if (it == m_configMap.end()) {
        // 查找的配置项不存在
        return "";
    }
    return it->second;
}